home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / tools / zmc3v078 / zmc3v078.lzh / SRCSV078.LZH / ZMC3.C < prev    next >
C/C++ Source or Header  |  2000-06-09  |  16KB  |  616 lines

  1. /* ======================================
  2.      ZMC3.{X,EXE} ... ZMS->ZMD compiler
  3.      for non X680x0 architectures
  4.    ====================================== */
  5.  
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <time.h>
  12.  
  13. #include "config.h"
  14.  
  15.  
  16. #ifndef UNIXY_OS                    /* for setmode() */
  17.     #include <fcntl.h>
  18.     #include <io.h>
  19.     #ifdef X68000
  20.         #include <unistd.h>
  21.     #endif
  22. #endif
  23.  
  24. #include "switch.h"
  25. #include "readfile.h"
  26. #include "makezmd.h"
  27. #include "etc.h"
  28.  
  29.  
  30. void help(int exitcode,int helpmode);
  31.  
  32.  
  33. FILE *openOutFile(void);
  34. void writeZmdFile(TRKCHINF *trkdata, COMMONINF *cominf, DWORD totalstep);
  35.  
  36. void checkSwitch(void);
  37. UBYTE *makeZmdHeaderBlock(TRKCHINF *trkdata,COMMONINF *cominf, DWORD totalstep);
  38. UBYTE *makeTrkChInfoTable(TRKCHINF *trkdata,COMMONINF *cominf, UDWORD *bytes);
  39.  
  40. #ifndef EXIT_SUCCESS
  41.     #define EXIT_SUCCESS    0
  42. #endif
  43.  
  44. #define TOTALHEAD    80        /* header size */
  45.  
  46.  
  47. int main(int argc,char *argv[])
  48. {
  49.     UBYTE        *zmsbuf;
  50.     TRKCHINF    *trkdata;
  51.     COMMONINF    cominf;
  52.     int i;
  53.     DWORD totalstep = 0;
  54. #ifdef UNIXY_OS
  55.     const char *inpEXT[] = { ".zms", ".zm3", ".opm", NULL};
  56.     const char *outEXT  = ".zmd";
  57. #else
  58.     const char *inpEXT[] = { ".ZMS", ".ZM3", ".OPM", NULL};
  59.     const char *outEXT  = ".ZMD";
  60. #endif
  61.  
  62.  
  63.     srand(time(NULL));
  64.     i = getSwitch(argc,argv);                    /* get switches/sourcefilename/dest.file */
  65.     /* setvbuf(stderr,NULL,_IONBF,0); */        /* no output buffering */
  66.  
  67.     fprintf(stderr,"ZMS to ZMD(V3) compiler version 0.78, by Mamiya / Y.Yagi,\n");
  68.     fprintf(stderr,"from Z-MUSIC UNIVERSAL VERSION 3.01A (C) ZENJI SOFT\n");
  69.  
  70.     if (i) {                                    /* bootup without any arguments */
  71.         help(0,0);
  72.     }
  73.  
  74.     checkSwitch();
  75.  
  76.  
  77.     if (!getInFile()[0]) {
  78. #ifdef UNIXY_OS
  79.         setInFile("-");
  80. #else
  81.         fatal(FILENOTFOUND,"Error: source file is not specified.\n");
  82. #endif
  83.     }
  84.  
  85.     zmsbuf = readFile(getInFile(),getOutFile(),inpEXT,outEXT);
  86.     trkdata = makeZmd(zmsbuf,getInFile(),&cominf, &totalstep);
  87.  
  88.     writeZmdFile(trkdata,&cominf, totalstep);
  89.  
  90.  
  91.     /* free(zmsbuf); */        /* already free-ed  in v3macro.c */
  92. #ifdef MEMDEBUG
  93.  
  94. /*    memdebug();
  95. */
  96. #endif
  97.  
  98.     return    EXIT_SUCCESS;
  99. }
  100.  
  101.  
  102.  
  103. /* =======================================================
  104.      open output file (with dispatching FILE and STDOUT)
  105.    ======================================================= */
  106.  
  107. FILE *openOutFile(void)
  108. {
  109.     int stdoutflg = 0;
  110.     FILE *fp;
  111.  
  112.     if (getSwitchVal('c') != RES_VAL) {        /* use stdout */
  113.         stdoutflg = 1;
  114.     }
  115.  
  116.     if (stdoutflg) {
  117. #ifndef UNIXY_OS                                /* set stdin to binary mode (MS-DOS only) */
  118.     #if defined (X68000) || defined (BCB)
  119.         #ifndef XCLIB
  120.             setmode(fileno(stdout),O_BINARY);    /* for BCB, DOS, OS/2, X680x0(libc) */
  121.         #else
  122.             fmode(stdout, _IOBINARY);            /* for X68000(XC) */
  123.         #endif
  124.     #elif defined (__TURBOC__)
  125.         setmode((stdout)->fd,O_BINARY);            /* for DOS(TurboC) */
  126.     #elif defined (TOWNS)
  127.         _setmode(stdout, _BINARY);                /* for TOWNS(HIGH-C) */
  128.     #endif
  129. #endif    /* UNIXY_OS */
  130.  
  131.         fp = stdout;
  132.     } else {
  133.         fp = fopen(getOutFile(),"wb");
  134.         if (fp == (FILE*)NULL) {
  135.             fatal(1,"%s\tError: destination file can't open.",getOutFile());
  136.         }
  137.     }
  138.     return fp;
  139. }
  140.  
  141.  
  142. /* =======================
  143.      write all ZMD files
  144.    ======================= */
  145.  
  146. void writeZmdFile(TRKCHINF *trkdata, COMMONINF *cominf, DWORD totalstep)
  147. {
  148.     int trks = 0, i, firsttrk = 1;
  149.     FILE *fp;
  150.     UDWORD bytes, bytes2;
  151.     DWORD offset;
  152.     UBYTE tmp[16];
  153.     int stdoutflg = 0;
  154.     UBYTE *headdata, *trktbl;
  155.  
  156.     fp = openOutFile();
  157.     if (fp == stdout) {
  158.         stdoutflg = 1;
  159.     }
  160.  
  161.  
  162.     /* header block */
  163.     headdata = makeZmdHeaderBlock(trkdata, cominf, totalstep);
  164.     bytes = fwrite(headdata, sizeof(UBYTE), TOTALHEAD, fp);
  165.     if (!stdoutflg && bytes < TOTALHEAD) {
  166.         fatal(1,"%s\tError: destination file can't write.",getOutFile());
  167.     }
  168.     efree(headdata,"headdata");
  169.  
  170.     /* common track */
  171.     if (trkdata[0].nowsize) {
  172.                                                 /* if ther is a common track */ 
  173.         bytes = fwrite(trkdata[0].zmdbuf,sizeof(UBYTE),trkdata[0].nowsize,fp);
  174.         if (!stdoutflg && bytes < (UDWORD)trkdata[0].nowsize) {
  175.             fatal(1,"%s\tError: destination file can't write.",getOutFile());
  176.         }
  177.     }
  178.     efree(trkdata[0].zmdbuf,"zmdbuf");
  179.  
  180.     /* trk/ch info.table */
  181.     trktbl = makeTrkChInfoTable(trkdata, cominf, &bytes2);
  182.     bytes = fwrite(trktbl, sizeof(UBYTE), bytes2, fp);
  183.     if (!stdoutflg && bytes < bytes2) {
  184.         fatal(1,"%s\tError: destination file can't write.",getOutFile());
  185.     }
  186.     efree(trktbl,"trktbl");
  187.  
  188.     /* trk data / trk additional info */
  189. #ifdef AAA
  190.     for (i = 1; cominf.trkassign[i] >= 0; i++) {
  191.         if (trkdata[Trk].mute && (*trkdata[Trk].zmdbuf != 0xFF || getSwitchVal('z') >= 3)) {
  192.             trks++;
  193.         }
  194.     }
  195. /* printf("trks=%d\n",trks); */
  196.     putWordAlign(tmp,trks);
  197.     bytes = fwrite(tmp,sizeof(UBYTE),2,fp);
  198.     if (!stdoutflg && bytes < 2) {
  199.         fatal(1,"%s\tError: destination file can't write.",getOutFile());
  200.     }
  201.     offset = trks * 6 - 4;
  202.     /* hedder part2 */
  203.     for (i = 0; i < trks; i++) {
  204.         /* putDwordAlign(tmp,offset); */
  205.         putDword(tmp,offset);
  206.         *(tmp + 4) = 0;
  207.         *(tmp + 5) = trkdata[cominf.trkassign[i]].ch;
  208.         bytes = fwrite(tmp,sizeof(UBYTE),6,fp);
  209.         if (!stdoutflg && bytes < 6) {
  210.             fatal(1,"%s\tError: destination file can't write.",getOutFile());
  211.         }
  212.  
  213.         offset += trkdata[cominf.trkassign[i]].nowsize;
  214.         offset -= 6;
  215.     }
  216.  
  217.     /* data */
  218. #endif
  219.  
  220.     for (i = 0; cominf->trkassign[i] >= 0; i++) {
  221.         const int Trk = cominf->trkassign[i];
  222.         if ((trkdata[Trk].mute && *trkdata[Trk].zmdbuf != 0xFF) || getSwitchVal('z') >= 3) {
  223.             UDWORD len = 0;
  224.  
  225.             if (firsttrk) {                /* +2 padding for TRKS(word) */
  226.                 int i;
  227.                 for (i = 0; i < 2; i++) {
  228.                     fputc(0x2F, fp);
  229.                 }
  230.                 firsttrk = 0;
  231.             }
  232.             putDword(tmp     , 0);    /* track total step time */
  233.             putDword(tmp +  4, 0);    /* track checksum */
  234.             putDword(tmp +  8, 0);    /* pars */
  235.             if (trkdata[Trk].cmnt) {
  236.                 putDword(tmp + 12, strlen(trkdata[Trk].cmnt));    /* comment len */
  237.             } else {
  238.                 putDword(tmp + 12, 0);
  239.             }
  240.  
  241.             bytes = fwrite(tmp,sizeof(UBYTE),16,fp);
  242.             if (!stdoutflg && bytes < 16) {
  243.                 fatal(1,"%s\tError: destination file can't write.",getOutFile());
  244.             }
  245.  
  246.  
  247.             if (trkdata[Trk].cmnt) {
  248.                 len = strlen(trkdata[Trk].cmnt);
  249.                 bytes = fwrite(trkdata[Trk].cmnt, sizeof(UBYTE),len, fp);
  250.                 if (!stdoutflg && bytes < len) {
  251.                     fatal(1,"%s\tError: destination file can't write.",getOutFile());
  252.                 }
  253.                 /* efree(trkdata[Trk].cmnt,"trkdata[Trk].cmnt"); */
  254.             }
  255.             if (len & 1) {                        /* padding if need */
  256.                 fputc(0, fp);
  257.             }
  258. #ifdef AA
  259.         if (len & 3) {                        /* padding if need */
  260.             int i;
  261.             for (i = (len & 3); i < 4; i++) {
  262.                 fputc(0, fp);
  263.             }
  264.         }
  265. #endif
  266.  
  267.             bytes = fwrite(trkdata[Trk].zmdbuf,sizeof(UBYTE),
  268.                             trkdata[Trk].nowsize,fp);
  269.             if (!stdoutflg && bytes < (UDWORD)trkdata[Trk].nowsize) {
  270.                 fatal(1,"%s\tError: destination file can't write.",getOutFile());
  271.             }
  272.  
  273. #ifdef Aa
  274. {
  275.     FILE *fp2;
  276.     char file[256];
  277.  
  278.     sprintf(file,"%d.tmp",Trk);
  279.     fp2 = fopen(file,"wb");
  280.     fwrite(trkdata[Trk].zmdbuf,sizeof(UBYTE),
  281.                             trkdata[Trk].nowsize,fp2);
  282.     fclose(fp2);
  283. }
  284. #endif
  285.  
  286.         }
  287.  
  288.         if (trkdata[Trk].cmnt) {
  289.             efree(trkdata[Trk].cmnt,"trkdata[Trk].cmnt");
  290.         }
  291.         efree(trkdata[Trk].zmdbuf, "trkdata[Trk].zmdbuf");
  292.     }
  293.  
  294.     if (!stdoutflg) {
  295.         fclose(fp);
  296.     }
  297.  
  298. /*
  299.     efree(trktbl);
  300.     efree(headdata);
  301. */
  302.     efree(trkdata,"trkdata");
  303. }
  304.  
  305.  
  306.  
  307. /* ================
  308.        put usage
  309.    ================ */
  310.  
  311. void help(int exitcode,int helpmode)
  312. {
  313.     const char *helpmes[] = {
  314. #ifdef UNIXY_OS
  315.         "usage: zmc3 [-switches] source[.zms] [-o destination[.zmd]] [-e errfile]",
  316. #else
  317.         "usage: zmc3 [-switches] source[.ZMS] [-o destination[.ZMD]] [-e errfile]",
  318. #endif
  319. #if WARNLVL == 1
  320.         "switch: -Wnum        warning level(1=none(default), 2=as V2(traditional),",
  321.         "                                   3=as V3, 4=most strict)",
  322. #elif WARNLVL == 2
  323.         "switch: -Wnum        warning level(1=none, 2=as V2(traditional,default),",
  324.         "                                   3=as V3(default), 4=most strict)",
  325. #elif WARNLVL == 3
  326.         "switch: -Wnum        warning level(1=none, 2=as V2(traditional),",
  327.         "                                   3=as V3(default), 4=most strict)",
  328. #else
  329.         "switch: -Wnum        warning level(1=none, 2=as V2(traditional),",
  330.         "                                   3=as V3, 4=most strict(default))",
  331. #endif
  332.         "        -Znum        compatible level(1=normal(default),",
  333.         "                                      3=ZMUSIC.X -c)",
  334.         "        -            use standard input (you must use it w/ -c or -o)",
  335.         "        -c           use standard output",
  336.         "        -e errfile   redirect stderr to specified file",
  337.         "        -l           change warning/error message pattern",
  338.         "        -o destname  specify ZMD filename",
  339.         "        -h           show this help messages",
  340.         "",
  341.         "Some FM/ADPCM MMLs will be ignored. (however to be supported)",
  342.         /* "FM/ADPCM MMLs will be ignored.", */
  343.  
  344. /*
  345.         "",
  346.         "If you want to show TIPS, type; zmc3 -h1 | more",
  347. */
  348.         NULL,
  349.  
  350.         "zmc3 tips",
  351.         "  When warning level is 1 or 2, zmc2-extended-MML will be warned.",
  352.         "e.g. YAMAHA-exclusive, portament MML at begining of line",
  353.         "",
  354.         "You can get the latest version at http://www2s.biglobe.ne.jp/~yyagi/",
  355.         NULL
  356.     };
  357.     char **str = (char**)helpmes;
  358.  
  359.     if (helpmode) {
  360.         while (*str++ != NULL)
  361.             ;
  362.     }
  363.     do {
  364.         fputs(*str++,stderr);
  365.         fputs("\n",stderr);
  366.     } while (*str != NULL);
  367.  
  368.     exit(exitcode);
  369. }
  370.  
  371.  
  372.  
  373. /* ==================
  374.      check switches
  375.    ================== */
  376.  
  377. void checkSwitch()
  378. {
  379.     int tmp;
  380.  
  381.     tmp = getSwitchVal('h');
  382.     if (tmp == 1) {
  383.         help(0,1);
  384.     } else if (tmp != RES_VAL) {
  385.         help(0,0);
  386.     }
  387.  
  388.     if (getOutFile()[0] && getSwitchVal('c') != RES_VAL) {
  389.         fatal(TOOMANYFILES,"You cannot use both -c and -o.\n");
  390.     }
  391.     if (getSwitchVal('w') == SET_VAL) {
  392.         fatal(SWERR,"You cannot omit -w's parameter.\n");
  393.     }
  394. }
  395.  
  396.  
  397. /* =========================================================
  398.      make ZMD header table
  399.      even if there are no common track and noplayng track,
  400.      this table is required.
  401.    ========================================================= */
  402.  
  403. UBYTE *makeZmdHeaderBlock(TRKCHINF *trkdata,COMMONINF *cominf, DWORD totalstep)
  404. {
  405.     UBYTE *head, *head_;
  406.     int i;
  407.     DWORD trks = 0;
  408.     DWORD totaltrksize = 2 + 2;        /* 2(trks.w) and 2(padding) */
  409.  
  410.     head_ = head = (UBYTE*)emalloc(sizeof(UBYTE) * TOTALHEAD, "headerBlock");
  411.  
  412.     strcpy(head,"\x1aZmuSiC\x30");    /* Z-MUSIC ID */
  413.     head += 8;
  414.  
  415.     if (trkdata[0].nowsize) {        /* offset to CommonBlock */ 
  416.         putDword(head, TOTALHEAD - (head - head_) - 4);
  417.     } else {
  418.         putDword(head, 0);
  419.     }
  420.     head += 4;
  421. /*
  422. fprintf(stderr,"total=%d ",totaltrksize);
  423. */
  424.     for (i = 0; cominf->trkassign[i] >= 0; i++) {
  425.         const int Trk = cominf->trkassign[i];
  426.         if ((trkdata[Trk].mute && *trkdata[Trk].zmdbuf != 0xFF) || (getSwitchVal('z') >= 3) ) {
  427.             trks++;
  428.             totaltrksize += trkdata[Trk].nowsize;
  429. /*
  430. fprintf(stderr,"total=%d ",totaltrksize);
  431. */
  432.                                         /* playing trk */
  433.             totaltrksize += 16;            /* size for trk/ch info. table */
  434.             totaltrksize += 16;            /* trk additional info */
  435.             if (trkdata[Trk].cmnt) {
  436.                 totaltrksize += strlen(trkdata[Trk].cmnt);
  437.             }
  438.             while (totaltrksize & 3) {
  439.                 totaltrksize++;
  440.             }
  441.         }
  442.     }
  443. #ifdef A
  444.     if (trkdata[0].zmdbuf[0] == 0xFF) {        /* if there is no data in commontrk */
  445.         totaltrksize -= 2;        /* delete 0xFF 0xFF */
  446.     }
  447. #endif
  448.  
  449. /* fprintf(stderr,"trks=%x total=%x ",trks,totaltrksize); */
  450.  
  451.  
  452.     if (totaltrksize) {                /* offset to trk/ch info. */
  453.         putDword(head, TOTALHEAD - (head - head_) - 4 + trkdata[0].nowsize);
  454.     } else {
  455.         putDword(head, 0);
  456.     }
  457. /*
  458. fprintf(stderr,"TOTALHEAD=%x, t0=%x, total=%x\n",TOTALHEAD,trkdata[0].nowsize, totaltrksize);
  459. */
  460.  
  461. /*========*/
  462.     head += 4;
  463.     putDword(head, 0);                /* no support for playcommand */
  464.     head += 4;
  465.     putDword(head, TOTALHEAD + trkdata[0].nowsize + totaltrksize);
  466.                                     /* ZMD file size */
  467.     head += 4;
  468.     putDword(head, 0);                /* no support for WRD data */
  469.     head += 4;
  470.     putDword(head, 0);                /* reserved */
  471.     head += 4;
  472. /*========*/
  473.     putDword(head, 0);                /* total step time offset */
  474.     head += 4;
  475.     if (cominf->cmnt) {                /* offset to the title */
  476.         putDword(head, TOTALHEAD - 0x28 + cominf->cmnt);
  477.     } else {
  478.         putDword(head, 0);
  479.     }
  480.     head += 4;
  481.     putDword(head, totalstep);        /* total step time */
  482.     head += 4;
  483.     putDword(head, 0);                /* playing time */
  484.     head += 4;
  485. /*========*/
  486.     putWord(head, cominf->meter);    /* meter n/m */
  487.     head += 2;
  488.     *head++ = 0;                    /* metronome speed */
  489.     *head++ = 0;                    /* reserved */
  490.     *head++ = cominf->key;            /* key */
  491.     *head++ = cominf->majorflag;    /* major / minor */
  492.     putWord(head, cominf->div);        /* master clock */
  493.     head += 2;
  494.     putWord(head, cominf->tempo);    /* tempo */
  495.     head += 2;
  496.     putWord(head, 0);                /* reserved */
  497.     head += 2;
  498.     putDword(head, cominf->z_cmn_flag);    /* com trk flag */
  499.     head += 4;
  500. /*=========*/
  501.     putDword(head, 0);                /* playcommand flag */
  502.     head += 4;
  503.     putDword(head, 0);                /* the type of instruments */
  504.     head += 4;
  505.     *head++ = 0;                    /* #of FM ch */
  506.     *head++ = 0;                    /* #of ADPCM ch */
  507.     *head++ = trks;                    /* #of MIDI-1 ch *
  508.     *head++ = 0;                    /* #of MIDI-2 ch *
  509.     *head++ = 0;                    /* #of MIDI-3 ch *
  510.     *head++ = 0;                    /* reserved */
  511.     putWord(head, 0);                /* reserved */
  512.  
  513.     return head_;
  514. }
  515.  
  516.  
  517. UBYTE *makeTrkChInfoTable(TRKCHINF *trkdata,COMMONINF *cominf, UDWORD *bytes)
  518. {
  519.     int i;
  520.     DWORD trks = 0, trk;
  521.     UBYTE *buf, *buf_;
  522.     DWORD headsize = 2;
  523.     DWORD trkofst;
  524.     int firsttrk = 1;
  525.  
  526.     for (i = 0; cominf->trkassign[i] >= 0; i++) {
  527.         int Trk = cominf->trkassign[i];
  528.         if ((trkdata[Trk].mute && *trkdata[Trk].zmdbuf != 0xFF) || getSwitchVal('z') >= 3) {
  529.             trks++;
  530.             headsize += 16;                /* size for trk/ch info. table */
  531.         }
  532.     }
  533.     /* *bytes = 2 + trks * 16; */
  534.     trkofst = headsize - 2 - 8 - 8;        /* */
  535.  
  536. /*fprintf(stderr,"[size: %x]\n",headsize);*/
  537.     buf_ = buf = (UBYTE*)emalloc(sizeof(UBYTE) * headsize, "headerCommon");
  538.     putWord(buf, trks - 1);
  539.     buf += 2;
  540.  
  541. /*    for (trk = 0; trk < trks; trk++) {*/
  542.     for (trk = 0; cominf->trkassign[trk] >= 0; trk++) {
  543.         int Trk = cominf->trkassign[trk];
  544.         if ((trkdata[Trk].mute && *trkdata[Trk].zmdbuf != 0xFF) || getSwitchVal('z') >= 3 ) {
  545.  
  546.             *buf++ = 0;                            /* performance track */
  547.             if (trkdata[Trk].trkm) {            /* track mode: normal/rhythm */
  548.                 *buf++ = 0x80;
  549.             } else {
  550.                 *buf++ = 0;
  551.             }
  552.             *buf++ = trkdata[Trk].trkf - 1;        /* freq */
  553. /* fprintf(stderr,"freq=%d ",trkdata[Trk].trkf - 1); */
  554.             *buf++ = 0;                            /* reserved */
  555.             putWord(buf, trkdata[Trk].chtype);    /* channel */
  556. /* fprintf(stderr,"chtype=%d ",trkdata[Trk].chtype); */
  557.             buf += 2;
  558.             putWord(buf, trkdata[Trk].ch_);        /* channel */
  559. /* fprintf(stderr,"ch=%d ",trkdata[Trk].ch_); */
  560.             buf += 2;
  561.  
  562.             buf += 4;                            /* offset to track additional info. */
  563.  
  564.             /* if (trk == 0) { */
  565.             if (firsttrk) {
  566.                 trkofst += 2;                    /* +2 for trks[word] */
  567.                 firsttrk = 0;
  568.             }
  569.  
  570. /*fprintf(stderr,"adinfo=%x ",trkofst);*/
  571.             putDword(buf, trkofst);
  572.             trkofst += 16;
  573.             if (trkdata[Trk].cmnt) {
  574.                 trkofst += strlen(trkdata[Trk].cmnt);
  575. /*fprintf(stderr,"(%d: %s)",Trk,trkdata[Trk].cmnt);*/
  576.             }
  577.             trkofst += 2;
  578.             while (trkofst & 1) {
  579.                 trkofst++;                        /* padding if need */
  580.             }
  581. #ifdef AA
  582.             if (trk == 0) {                        /* +2 for padding */
  583.                 trkofst += 2;
  584.             }
  585. #endif
  586.             /* trkofst += 2; */
  587.             trkofst += 2;
  588.             buf -= 4;
  589.  
  590.             putDword(buf, trkofst);            /* offset to track data */
  591.  
  592. /*fprintf(stderr,"trkofst=%.2x ",trkofst );*/
  593.  
  594.             buf += 8;
  595.             trkofst += trkdata[Trk].nowsize;
  596. /*
  597. fprintf(stderr,"[trkofst=%.2x] ",trkofst);
  598. */
  599.             trkofst -= 16 + 4;
  600.         }
  601.     }
  602.  
  603.     *bytes = headsize;
  604.  
  605.     return buf_;
  606. }
  607. #ifdef AA
  608.         totaltrksize += trkdata[i].nowsize;
  609.         if (i) {                        /* playing trk */
  610.             totaltrksize += 18;            /* size for trk/ch info. table */
  611.             if (trkdata[i].cmnt) {
  612.                 totaltrksize += 16 + strlen(trkdata[i].cmnt);
  613.             }
  614.         }
  615. #endif
  616.